package com.xuecheng.content.controller;

import com.xuecheng.api.content.FileAndSmsAPI;
import com.xuecheng.api.content.model.file.UploadTokenResult;
import com.xuecheng.common.domain.code.CommonErrorCode;
import com.xuecheng.common.enums.common.CommonEnum;
import com.xuecheng.common.exception.ExceptionCast;
import com.xuecheng.common.util.RandomStringUtil;
import com.xuecheng.content.common.constant.ContentErrorCode;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.RandomStringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * 课程管理服务获得外部接口 Api
 *
 * @author lily
 * @date 2021/12/13
 */
@Slf4j
@RestController
public class FileManagerController implements FileAndSmsAPI {

    @Autowired
    private RestTemplate restTemplate;

    // 通过配置文件给属性赋值
    // 文件系统微服的请求地址
    @Value("${file.service.url}")
    private String url;

    // 文件存储空间名称
    @Value("${file.service.bucket}")
    private String bucket;

    // 文件存储区域的地址
    @Value("${file.service.upload.region}")
    private String region;

    // 文件访问的cdn加速域名
    @Value("${cdn.domain}")
    private String domain;

    // 固定值1
    @Value("${file.token.type}")
    private String type;

    // 最长时间
    @Value("${file.token.deadline}")
    private int deadline;


    /**
     * 返回前端上传时的 token 凭证
     *
    * @author Lily
    * @date 2021/12/13 19:26
    * @paramType [] 
    * @return com.xuecheng.api.content.model.file.UploadTokenResult
    * @description 
    */
    @GetMapping("common/qnUploadToken")
    @Override
    public UploadTokenResult qiniuUploadToken() {

        // 1.发送请求获得文件上传出凭证
        HashMap<String, Object> requestBody = new HashMap<>();
        requestBody.put("tokenType", type);
        requestBody.put("scope", bucket);
        requestBody.put("deadline", deadline);

        // 上传文件的key：唯一
        // 一个UUID + 上一个 16位的随机数字+字母组成的字符
        String fileKey = UUID.randomUUID().toString() + RandomStringUtils.randomAlphabetic(16);
        requestBody.put("key", fileKey);

        // TODO 这段代码的作用？应该是发送请求，然后把返回的数据封装到Map中
        ResponseEntity<Map> entity = restTemplate.postForEntity(url, requestBody, Map.class);

        // 获取请求的状态码
        int statusCodeValue = entity.getStatusCodeValue();

        // 判断状态码是否为200，也就是成功
        if (!(HttpStatus.OK.value() == statusCodeValue)) {
            ExceptionCast.cast(CommonErrorCode.E_100106);
        }

        // 成功将数据封装到Map中
        Map body = entity.getBody();

        // 2.将结果封装成前端所需要的内容并返回
        UploadTokenResult tokenResult = new UploadTokenResult();

        tokenResult.setTokenType(type);
        tokenResult.setScope(bucket);
        tokenResult.setKey(fileKey);
        tokenResult.setQnToken(body.get("result").toString());
        tokenResult.setUp_region(region);
        tokenResult.setDomain(domain);
        tokenResult.setDeadline(deadline);

        return tokenResult;
    }
}
